package com.kingmed.kmss.common.utils;

import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.commons.lang3.time.DateUtils;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalAdjusters;
import java.util.Date;

/**
 * 日期、时间工具类 其中的日期、时间处理类，使用了Java 8的新类型。为了不和原有方法冲突，这里的方法名后缀加了"J8"
 * 
 *
 */
public class DateTimeUtil {

	private static String datePattern = "yyyy-MM-dd HH:mm:ss";

	/**
	 * 获得当前的自然日期
	 * 
	 * @return LocalDate 日期格式是 "2014-01-14"
	 */
	public static LocalDate getCurrentDateJ8() {
		return LocalDate.now();
	}

	/**
	 * 获得当前的时间，只返回时、分、秒、毫秒，没有日期
	 * 
	 * @return LocaleTime 时间格式是： “18:33:33.369”
	 */
	public static LocalTime getCurrentTimeJ8() {
		return LocalTime.now();
	}

	/**
	 * 获得当前的时间戳
	 * 
	 * @return
	 */
	public static Instant getCurrentTimestampJ8() {
		return Instant.now();
	}
	
	/**
	 * 获得当前时间
	 * 
	 * @return
	 */
	public static String getCurrentDateTimeStr() {
		SimpleDateFormat dateFmt = new SimpleDateFormat(datePattern);
		return dateFmt.format(Date.from(Instant.now()));
	}

	public static Date getCurrentDateTime() {
		return Date.from(Instant.now());
	}
	/**
	 * 根据输入的年、月、日参数，获得指定的日期
	 * 
	 * @param year
	 * @param month
	 * @param dayOfMonth
	 * @return LocalDate 返回指定的日期
	 */
	public static LocalDate getDateJ8(int year, int month, int dayOfMonth) {
		return LocalDate.of(year, month, dayOfMonth);
	}

	/**
	 * 根据日期字符串，获得日期
	 * 
	 * @param dateString 格式 "yyyymmdd"
	 * @return LocalDate
	 */
	public static LocalDate getDateFromStringJ8(String dateString) {
		return LocalDate.parse(dateString, DateTimeFormatter.BASIC_ISO_DATE);

	}

	/**
	 * 获得短格式的日期字符串
	 * 
	 * @param date
	 * @return @return 日期的字符串，，形如"yyyyMMdd"
	 */
	public static String getDateStringWtihShortFormat(LocalDate date) {
		DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
		return date.format(formatter);
	}

	/**
	 * 获得短格式的日期字符串
	 * 
	 * @param date
	 * @return 日期的字符串，，形如"yyyy-MM-dd"
	 */
	public static String getDateStringWtihLongFormat(LocalDate date) {
		DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
		return date.format(formatter);
	}

	/**
	 * 获得距离今天，几天后的日期
	 * 
	 * @param days 指定的天数
	 * @return LocalDate
	 */
	public static LocalDate getDateNextDaysFromToday(int days) {
		return LocalDate.now().plus(days, ChronoUnit.DAYS);
	}

	public static Date getNextDateFromToday(int days) {
		return toDate(LocalDate.now().plus(days, ChronoUnit.DAYS));
	}
	
	/**
	 * 获得距离今天，几周后的日期
	 * 
	 * @param weeks 指定的星期数
	 * @return LocalDate
	 */
	public static LocalDate getDateNextWeeksFromToday(int weeks) {
		return LocalDate.now().plus(weeks, ChronoUnit.WEEKS);
	}

	/**
	 * 获得距离今天，几天前的日期
	 * 
	 * @param weeks 指定的天数
	 * @return LocalDate
	 */
	public static LocalDate getDatePreviousDaysFromToday(int days) {
		return LocalDate.now().minus(days, ChronoUnit.DAYS);
	}
	
	/**
	 * 获得距离今天，几天前的日期
	 * 
	 * @param weeks 指定的天数
	 * @return LocalDate
	 */
	public static Date getPreviousDaysFromToday(int days) {
		return toDate(LocalDate.now().minus(days, ChronoUnit.DAYS));
	}
	
	/**
	 * 获得距离今天日期
	 * 
	 * 
	 * @return Date
	 */
	public static Date getToday() {
		return toDate(getCurrentDateJ8());
	}

	/**
	 * 获得距离今天，几周前的日期
	 * 
	 * @param weeks 指定的星期数
	 * @return LocalDate
	 */
	public static LocalDate getDatePreviousWeeksFromToday(int weeks) {
		return LocalDate.now().minus(weeks, ChronoUnit.WEEKS);
	}

	/**
	 * 判断是否闰年
	 * 
	 * @param day
	 * @return boolean
	 */
	public static boolean isLeapYear(LocalDate day) {
		return day.isLeapYear();
	}

	/**
	 * 获得两个日期之间相差的天数
	 * 
	 * @param newerDate
	 * @param olderDate
	 * @return
	 */
	public static int getDaysBetweenTwoDate(LocalDate startDate, LocalDate endDate) {
		Period period = Period.between(startDate, endDate);
		return period.getDays();
	}

	/**
	 * 将字符串转换成 Date
	 * 
	 * @param str
	 * @return Date
	 */
	public static Date stringToDate(String str) {

		Date date;
		try {
			if (str != null && str.length() == 10)
				date = DateUtils.parseDate(str, "yyyy-MM-dd");
			else if (str != null && str.length() == 8) {
				StringBuffer sb = new StringBuffer();
				sb.append(str.substring(0, 4) + "-" + str.substring(4, 6) + "-" + str.substring(6, 8));
				System.out.println(sb.toString());
				date = DateUtils.parseDate(sb.toString(), "yyyy-MM-dd");
			} else if (str != null && str.length() >= 19)
				date = DateUtils.parseDate(str.substring(0, 19), datePattern);
			else
				date = null;

		} catch (Exception e) {
			date = null;
		}
		return date;
	}

	/**
	 * LocalDate转为Date
	 * @param localDate
	 * @return
	 */
	public static Date toDate(LocalDate localDate) {
		ZoneId zone = ZoneId.systemDefault();
		Instant instant = localDate.atStartOfDay().atZone(zone).toInstant();
		return Date.from(instant);
	}

    /**
     * 获取当前日期 YYYY-MM-DD
     *
     * @param date
     * @return
     */
    public static Date currentDate(Date date) {
        DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        String format = formatter.format(date);
        try {
            Date parse = formatter.parse(format);
            return parse;
        } catch (Exception e) {

        }
        return null;
    }

	public static String dateStrToFormat(String date) {
		DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
		return formatter.format(date);
	}

	/**
	 * 日期路径 即年/月/日 如2018/08/08
	 */
	public static final String datePath()
	{
		Date now = new Date();
		return DateFormatUtils.format(now, "yyyy/MM/dd");
	}
    /**
     * 取得当前年第一天
     * @return
     */
    public static Date getCurrentYearStart() {
    	LocalDate nowDate = LocalDate.now();

        LocalDate firstDayofYear = nowDate.with(TemporalAdjusters.firstDayOfYear());
        return toDate(firstDayofYear);
    }
}
